iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
0

本篇重點

什麼是Dependency Injection
Dependency Injection 在 .NET Core扮演的角色
Service Lifetime


前言

ASP .NET Core 仰賴相依性注入 DI (Dependency Injection)
這篇整理一下DI的介紹,以及來釐清在整個 .NET Core 平台是如何使用DI去使用每個服務的

相依性注入 DI- Dependency Injection

DI是一種design patten
主要透過介面的設計去注入到不同的Object
在Study DI 的時候,一定會看到另外一個名詞

IoC - Inversion of Control 控制反轉
以下有爬到一篇大大的簡單清楚的說明

大神文章 - IoC基本概念介紹

簡單來說(畫重點)

  • IOC 產生介面提供使用端去實作
    就是將傳統由上到下的開發思維,改用介面的方式操作,需要用的的時候再將介面實例化就可以了,如此一來就不需要寫太多重複的程式碼,也可增加彈性及擴充性

  • DI 將interface,真正注入到物件的方式
    決定什麼時候要使用這些建立好的interface,怎麼使用?
    C#裡有提供三種 DI 的操作方式 (從建構子/屬性/方法去注入介面)
    而 ASP .NET Core 是使用 Constructor Injection ,在建構子的時候去注入介面

    • Constructor Injection
    • Property Injection
    • Method Injection

ASP .NET Core DI

前面敘述的是DI的作用,那接下來要提到的問題就是

微軟有沒有一些現成已經做好的DI可以直接使用?

如果要自己實作一個DI, ASP .NET Core又該如何去實作?

在 ASP .NET Core裡的DI,主要分成下列兩大類:

  1. Framework Services(微軟已經幫我們做好的)
    在專案範本下看到的IServiceCollection,IWebHostEnvironment 以及IApplicationBuilder 等等

  2. Application Services(我們自己開發的)

這裡要先提一個東西IoC Container
IoC 是一個設計的原理概念,IoC Container是一個提供這種設計原理(IoC)的一個容器,在 .NET 裡面可以把它想成就是一些一堆framework來提供我們實例化的東西注入我們要的目的位子,去執行設計好的邏輯

在這邊用自己的理解來舉一個簡單的例子
有一天忽然想要吃麥當勞的薯條
我可以透過foodpanda 去 達成我的目的

可以把 foodpanda 想成是一個Ioc Container , 我想要買麥當勞的薯條, 我可以透過外送平台去幫我拿到我要的薯條(要實例化的 Object )
,假設今天想要是鼎泰豐(其他的 Object ),我只要注入我想要吃的餐廳,就可以去使用那個餐廳的餐點(物件裡面的參數或方法)

我 - 目標的Object
foodpanda - IoC Container
麥當勞 - 需要實例化的Object

後面會利用這個例子去做一個範例


ASP .NET Core IoC Container

所以在ASP .NET Core 裡的 IoC Container 提供了兩個介面,透過這些界面下的擴充方法可以去實例化我們要注入的物件
(就像外送平台有Uber eats, foodpand...etc)

  • IServiceProvider
    這個介面使用的方式待補
    目前只知道有提供一個GetService可以去實例化物件
    但如何使用,這部分還要再研究,也歡迎有大大理解的可以指教一下

  • IServiceCollection
    網路上大部分的範例以及解說都是在講這一個介面
    後面也會練習一下使用這個介面去操作

先來看一下這兩個介面的可以實作的關係圖


Service Lifetime

這裡討論的service 主要是針對 IServiceCollection
其中的生命週期有包含以下三種

  • Singleton
    只要宣告一次,會一直存在應用程式中,會是同一個實體
  • Transient
    每次宣告都會產生一個新的實體
  • Scoped
    針對同一個request 的,會是同一個實體

Service的擴充方法

對應上述的三種生命週期的特性
IServiceCollection 下也提供了三種對應的方法,這些方法就是網路上大家說的 DI 時 service 所使用的方法

  • AddSingleton()
    如果要使用共用全域的components,也就是在startup.cs註冊的,通常建議用AddSingleton()
  • AddScoped()
    Entity Framework 或是DB的行為時,可用AddScoped()
  • AddTransient()
    至於其他的註冊,就可以使用AddTransient()

後續會再補上一個範例


參考資料

https://blog.johnwu.cc/article/ironman-day04-asp-net-core-dependency-injection.html

https://www.tutorialsteacher.com/core/internals-of-builtin-ioc-container-in-aspnet-core

https://stackoverflow.com/questions/49570686/what-is-the-purpose-of-iserviceprovider-getservicetype-servicetype


上一篇
Day 4 Middleware
下一篇
Day 6 Logging
系列文
ASP.NET Core 入門實戰30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言